import axios from 'axios'
import { baseURL, timeout } from '@/common/const'
import vue from '../main'
import Vue from 'vue'
import qs from 'qs'

Vue.prototype.qs = qs


// 后端设置了跨域以及携带cookies前端不要设置
axios.defaults.timeout = timeout
axios.defaults.baseURL = baseURL

const createInstance = () => {
  const instance = axios.create({
    headers: {
      'Content-type': 'application/x-www-form-urlencoded',
      Authorization: vue.$store.state.accessToken
    }
  })

  instance.interceptors.request.use(config => {
    console.log(config)
    return config
  }, error => {
    vue.$Message.error(error)
    return Promise.reject(error)
  })

  instance.interceptors.response.use(res => {
    console.log('返回数据', res.data)
    return res.data
  }, error => {
    console.log('响应出错：', error)
    if (error.response) {
      console.log(error.response)
      vue.$Message.error(error.response.status.toString() + ' ' + error.response.data.error)
    } else {
      // 响应出错没有response实体的，比如跨域，重定向出错，响应超时等
      // 一般实际情况下开发时会解决跨域和重定向问题，实际可能发生的情况是网络中断或者没有服务端服务造成超时
      vue.$Message.warning('请求超时，请保证网络流畅或联系我们')
    }
    return Promise.reject(error)
  })

  return instance
}

Vue.prototype.$post = (url, data) => {
  const instance = createInstance()
  instance.defaults.method = 'post'
  // send real request
  return instance({
    url: url,
    data: qs.stringify(data)
  })
}

Vue.prototype.$get = (url, params = {}) => {
  // default get
  const instance = createInstance()
  // send real request
  return instance({
    url: url,
    params: params
  })
}

Vue.prototype.$postApplicationJson = (url, data) => {
  const instance = axios.create({
    headers: {
      'Content-type': 'application/json',
      Authorization: vue.$store.state.accessToken
    }
  })

  instance.interceptors.request.use(config => {
    console.log(config)
    return config
  }, error => {
    console.log('请求出错：', error)
    return Promise.reject(error)
  })

  instance.interceptors.response.use(res => {
    console.log('返回数据', res.data)
    return res.data
  }, error => {
    console.log('响应出错：', error)
    if (error.response) {
      vue.$Message.error(error.response.status.toString())
    } else {
      // 响应出错没有response实体的，比如跨域，重定向出错，响应超时等
      // 一般实际情况下开发时会解决跨域和重定向问题，实际可能发生的情况是网络中断或者没有服务端服务造成超时
      vue.$Message.warning('上传超时，请保证网络流畅或联系我们')
    }
    return Promise.reject(error)
  })

  instance.defaults.method = 'post'
  // send real request
  return instance({
    url,
    data
  })
}

Vue.prototype.$uploadFile = (url, data) => {
  const instance = axios.create({
    headers: {
      'Content-type': 'multipart/form-data',
      Authorization: vue.$store.state.accessToken
    }
  })

  instance.interceptors.request.use(config => {
    console.log(config)
    return config
  }, error => {
    console.log('请求出错：', error)
    return Promise.reject(error)
  })

  instance.interceptors.response.use(res => {
    return res.data
  }, error => {
    console.log('响应出错：', error)
    if (error.response) {
      vue.$Message.error(error.response.status.toString())
    } else {
      // 响应出错没有response实体的，比如跨域，重定向出错，响应超时等
      // 一般实际情况下开发时会解决跨域和重定向问题，实际可能发生的情况是网络中断或者没有服务端服务造成超时
      vue.$Message.warning('上传超时，请保证网络流畅或联系我们')
    }
    return Promise.reject(error)
  })

  instance.defaults.method = 'post'
  // send real request
  return instance({
    url: url,
    data: qs.stringify(data)
  })
}
